﻿using System;
using System.ComponentModel;
using System.Configuration;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Image = System.Web.UI.WebControls.Image;

namespace APILocawebGatewayUI.Nucleo
{
    public abstract class Cartao : Image
    {



        #region Propriedades
        [Category("Parâmetros opcionais")]
        [Description("Javascript que será disparado no OnClick")]
        [DefaultValue("")]
        [Browsable(false)]
        public string OnClick
        {
            get
            {
                object o = ViewState["OnClick"];
                return o == null ? String.Empty : o.ToString();
            }
            set { ViewState["OnClick"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Javascript que será disparado no OnSubmit")]
        [DefaultValue("")]
        [Browsable(false)]
        public string OnSubmit
        {
            get
            {
                object o = ViewState["OnSubmit"];
                return o == null ? String.Empty : o.ToString();
            }
            set { ViewState["OnSubmit"] = value; }
        }

        [Browsable(false)]
        public virtual string ImgCartao
        {
            get;
            set;
        }

        [Browsable(false)]
        public virtual string Modulo
        {
            get;
            set;
        }

        /// <summary>
        /// 
        /// </summary>
        [Browsable(false)]
        private bool EscreveFormulario
        {
            get { return Convert.ToBoolean(HttpContext.Current.Session["__LocawebGatewayUI_____"]); }
            set { HttpContext.Current.Session["__LocawebGatewayUI_____"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Url do Gateway")]
        [DefaultValue("https://comercio.locaweb.com.br/comercio.comp")]
        [Browsable(false)]
        public string CaminhoDoGateway
        {
            get
            {
                object o = ViewState["CaminhoDoGateway"];
                return o == null ? APILocawebConfiguration.Instancia.Url : o.ToString();
            }
            set { ViewState["CaminhoDoGateway"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Código de serviço de Comércio Eletrônico junto à Locaweb")]
        [DefaultValue("")]
        [Browsable(false)]
        public string Identificacao
        {
            get
            {
                object o = ViewState["CaminhoDoGateway"];
                return o == null ? APILocawebConfiguration.Instancia.Identificacao : o.ToString();
            }
            set { ViewState["Identificacao"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Define o tipo de ambiente (teste ou producao).")]
        [DefaultValue("Teste")]
        [Browsable(false)]
        public virtual string Ambiente
        {
            get
            {
                object o = ViewState["Ambiente"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["Ambiente"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Tipo de parcelamento da transação, juros do lojista ou juros do emissor.")]
        [DefaultValue(typeof(TiposParcelamento), "JurosDoLogista")]
        public virtual TiposParcelamento TipoDeParcelamento
        {
            get
            {
                object o = ViewState["TiposParcelamento"];
                if (o == null)
                    return TiposParcelamento.JurosDoLojista;
                return (TiposParcelamento)o;
            }
            set { ViewState["TiposParcelamento"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Campo Livre.")]
        [DefaultValue("")]
        public virtual string CampoLivre
        {
            get
            {
                object o = ViewState["DescricaoDaVenda"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["DescricaoDaVenda"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Valor da transação.")]
        [DefaultValue("")]
        public string Valor
        {
            get
            {
                object o = ViewState["Valor"];
                if (o == null)
                    return "0";
                return o.ToString();
            }
            set { ViewState["Valor"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Número de parcelas da transação")]
        [DefaultValue("1")]
        public virtual string Parcelas
        {
            get
            {
                object o = ViewState["Parcelas"];
                if (o == null)
                    return "1";
                return o.ToString();
            }
            set { ViewState["Parcelas"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Número de fatura da transação junto à loja (número do pedido - Não pode se repetir).")]
        [DefaultValue("")]
        public string NumeroDoPedido
        {
            get
            {
                object o = ViewState["NumeroDoPedido"];
                if (o == null)
                    return "";
                return o.ToString();
            }
            set { ViewState["NumeroDoPedido"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Idioma utilizado no ambiente Amex")]
        [DefaultValue(typeof(IdiomaDoSite), "Portugues")]
        public IdiomaDoSite IdiomaDoSite
        {
            get
            {
                object o = ViewState["IdiomaDoSite"];
                if (o == null)
                    return IdiomaDoSite.Portugues;
                return (IdiomaDoSite)o;
            }
            set { ViewState["IdiomaDoSite"] = value; }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Define a ação que será executada. Utilizar “Pagamento” para processar uma transação de venda.")]
        [DefaultValue("")]
        [Browsable(false)]
        public string Operacao
        {
            get
            {
                return "Pagamento";
            }
        }

        [Category("Parâmetros opcionais")]
        public override string AlternateText
        {
            get
            {
                return base.AlternateText;
            }
            set
            {
                base.AlternateText = value;
            }
        }

        [Category("Parâmetros opcionais")]
        [Description("Caso não seja selecionada uma imagem, será exibida uma padrão já aprovada pelo cartão.")]
        public override string ImageUrl
        {
            get
            {
                return base.ImageUrl;
            }
            set
            {
                base.ImageUrl = value;
            }
        }
        #endregion

        #region Propriedades Browsable false
        [Browsable(false)]
        public sealed override ImageAlign ImageAlign
        {
            get
            {
                return base.ImageAlign;
            }
            set
            {
                base.ImageAlign = value;
            }
        }

        [Browsable(false)]
        public sealed override bool GenerateEmptyAlternateText
        {
            get
            {
                return base.GenerateEmptyAlternateText;
            }
            set
            {
                base.GenerateEmptyAlternateText = value;
            }
        }

        [Browsable(false)]
        public sealed override string DescriptionUrl
        {
            get
            {
                return base.DescriptionUrl;
            }
            set
            {
                base.DescriptionUrl = value;
            }
        }



        [Browsable(false)]
        public sealed override Color ForeColor
        {
            get
            {
                return base.ForeColor;
            }
            set
            {
                base.ForeColor = value;
            }
        }

        [Browsable(false)]
        public sealed override string CssClass
        {
            get
            {
                return base.CssClass;
            }
            set
            {
                base.CssClass = value;
            }
        }


        [Browsable(false)]
        public sealed override Color BackColor
        {
            get
            {
                return base.BackColor;
            }
            set
            {
                base.BackColor = value;
            }
        }

        [Browsable(false)]
        public sealed override Color BorderColor
        {
            get
            {
                return base.BorderColor;
            }
            set
            {
                base.BorderColor = value;
            }
        }

        [Browsable(false)]
        public sealed override BorderStyle BorderStyle
        {
            get
            {
                return base.BorderStyle;
            }
            set
            {
                base.BorderStyle = value;
            }
        }

        [Browsable(false)]
        public sealed override FontInfo Font
        {
            get
            {
                return base.Font;
            }
        }

        [Browsable(false)]
        public sealed override Unit BorderWidth
        {
            get
            {
                return base.BorderWidth;
            }
            set
            {
                base.BorderWidth = value;
            }
        }

        #endregion



        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            if (DesignMode)
            {
                base.RenderBeginTag(writer);
            }
            else
            {
                ///IMPORTANTE: Utilizado para correção do problema de remoção do form automatico pelo aspnetform
                if (!EscreveFormulario)
                {
                    writer.Write("<form style='display:none'></form>");
                    EscreveFormulario = true;
                }



                writer.Write("<form onSubmit=\"" + OnSubmit + "\" name='" + this.ClientID + "' id='" + this.ClientID + "' method='POST' action='" + this.CaminhoDoGateway + "' target='_blank' style='padding:0px; margin:0px; border:0px;'>\n");


                if (string.IsNullOrEmpty(base.ImageUrl))
                    base.ImageUrl = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), ImgCartao);

                if (base.ImageUrl.Contains("~"))
                    base.ImageUrl = base.ImageUrl.Remove(0, 1);

                writer.Write("<input onclick=\"" + OnClick + "\" type=\"image\" src=\"" + base.ImageUrl + "\" ");
                if (base.Width != Unit.Empty)
                    writer.Write("width=\"" + base.Width + "\" ");
                if (base.Height != Unit.Empty)
                    writer.Write("height=\"" + base.Height + "\" ");
                if (!string.IsNullOrEmpty(base.AlternateText))
                    writer.Write("alt=\"" + base.AlternateText + "\" title=\"" + base.AlternateText + "\"");
                if (base.TabIndex != 0)
                    writer.Write("tabindex=\"" + base.TabIndex + "\"");
                if (!string.IsNullOrEmpty(base.AccessKey))
                    writer.Write("accesskey=\"" + base.AccessKey + "\"");

                writer.Write(" />\n");
            }
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
            if (DesignMode)
                base.RenderEndTag(writer);

            writer.Write("</form>");
        }

        public String RenderizarFormulario()
        {
            HtmlTextWriter writter = new HtmlTextWriter(new StringWriter());
            RenderBeginTag(writter);
            RenderEndTag(writter);
            return writter.InnerWriter.ToString();

        }

        public Cartao(Page pagina, String valor, String numeroDoPedido)
        {
            this.Page = pagina;
            this.Valor = valor;
            this.NumeroDoPedido = numeroDoPedido;
        }
        public Cartao()
        {

        }
    }
}